1   /*
2    * Copyright (C) 2012 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.reflect;
18  
19  import com.google.common.testing.EqualsTester;
20  import com.google.common.testing.NullPointerTester;
21  
22  import junit.framework.TestCase;
23  
24  import java.lang.annotation.Retention;
25  import java.lang.annotation.RetentionPolicy;
26  import java.lang.reflect.Constructor;
27  
28  /**
29   * Unit tests of {@link Element}.
30   *
31   * @author Ben Yu
32   */
33  public class ElementTest extends TestCase {
34  
35    public void testPrivateField() throws Exception {
36      Element element = A.field("privateField");
37      assertTrue(element.isPrivate());
38      assertFalse(element.isAbstract());
39      assertFalse(element.isPackagePrivate());
40      assertFalse(element.isProtected());
41      assertFalse(element.isPublic());
42      assertFalse(element.isFinal());
43      assertFalse(element.isStatic());
44      assertTrue(element.isAnnotationPresent(Tested.class));
45    }
46  
47    public void testPackagePrivateField() throws Exception {
48      Element element = A.field("packagePrivateField");
49      assertFalse(element.isPrivate());
50      assertTrue(element.isPackagePrivate());
51      assertFalse(element.isProtected());
52      assertFalse(element.isPublic());
53      assertFalse(element.isFinal());
54      assertFalse(element.isStatic());
55      assertTrue(element.isAnnotationPresent(Tested.class));
56    }
57  
58    public void testProtectedField() throws Exception {
59      Element element = A.field("protectedField");
60      assertFalse(element.isPrivate());
61      assertFalse(element.isPackagePrivate());
62      assertTrue(element.isProtected());
63      assertFalse(element.isPublic());
64      assertFalse(element.isFinal());
65      assertFalse(element.isStatic());
66      assertTrue(element.isAnnotationPresent(Tested.class));
67    }
68  
69    public void testPublicField() throws Exception {
70      Element element = A.field("publicField");
71      assertFalse(element.isPrivate());
72      assertFalse(element.isPackagePrivate());
73      assertFalse(element.isProtected());
74      assertTrue(element.isPublic());
75      assertFalse(element.isFinal());
76      assertFalse(element.isStatic());
77      assertTrue(element.isAnnotationPresent(Tested.class));
78    }
79  
80    public void testFinalField() throws Exception {
81      Element element = A.field("finalField");
82      assertTrue(element.isFinal());
83      assertFalse(element.isStatic());
84      assertTrue(element.isAnnotationPresent(Tested.class));
85    }
86  
87    public void testStaticField() throws Exception {
88      Element element = A.field("staticField");
89      assertTrue(element.isStatic());
90      assertTrue(element.isAnnotationPresent(Tested.class));
91    }
92  
93    public void testVolatileField() throws Exception {
94      Element element = A.field("volatileField");
95      assertTrue(element.isVolatile());
96    }
97  
98    public void testTransientField() throws Exception {
99      Element element = A.field("transientField");
100     assertTrue(element.isTransient());
101   }
102 
103   public void testConstructor() throws Exception {
104     Element element = A.constructor();
105     assertTrue(element.isPublic());
106     assertFalse(element.isPackagePrivate());
107     assertFalse(element.isAbstract());
108     assertFalse(element.isStatic());
109     assertTrue(element.isAnnotationPresent(Tested.class));
110   }
111 
112   public void testAbstractMethod() throws Exception {
113     Element element = A.method("abstractMethod");
114     assertTrue(element.isPackagePrivate());
115     assertTrue(element.isAbstract());
116     assertFalse(element.isFinal());
117     assertTrue(element.isAnnotationPresent(Tested.class));
118   }
119 
120   public void testOverridableMethod() throws Exception {
121     Element element = A.method("overridableMethod");
122     assertTrue(element.isPackagePrivate());
123     assertFalse(element.isAbstract());
124     assertFalse(element.isFinal());
125     assertTrue(element.isAnnotationPresent(Tested.class));
126   }
127 
128   public void testPrivateMethod() throws Exception {
129     Element element = A.method("privateMethod");
130     assertFalse(element.isAbstract());
131     assertTrue(element.isPrivate());
132     assertFalse(element.isPackagePrivate());
133     assertFalse(element.isPublic());
134     assertFalse(element.isProtected());
135     assertTrue(element.isAnnotationPresent(Tested.class));
136   }
137 
138   public void testProtectedMethod() throws Exception {
139     Element element = A.method("protectedMethod");
140     assertFalse(element.isAbstract());
141     assertFalse(element.isPrivate());
142     assertFalse(element.isPackagePrivate());
143     assertFalse(element.isFinal());
144     assertFalse(element.isPublic());
145     assertTrue(element.isProtected());
146     assertTrue(element.isAnnotationPresent(Tested.class));
147   }
148 
149   public void testFinalMethod() throws Exception {
150     Element element = A.method("publicFinalMethod");
151     assertFalse(element.isAbstract());
152     assertFalse(element.isPrivate());
153     assertTrue(element.isFinal());
154     assertTrue(element.isPublic());
155     assertTrue(element.isAnnotationPresent(Tested.class));
156   }
157 
158   public void testNativeMethod() throws Exception {
159     Element element = A.method("nativeMethod");
160     assertTrue(element.isNative());
161     assertTrue(element.isPackagePrivate());
162   }
163 
164   public void testSynchronizedMethod() throws Exception {
165     Element element = A.method("synchronizedMethod");
166     assertTrue(element.isSynchronized());
167   }
168 
169   public void testUnannotatedMethod() throws Exception {
170     Element element = A.method("notAnnotatedMethod");
171     assertFalse(element.isAnnotationPresent(Tested.class));
172   }
173 
174   public void testEquals() throws Exception {
175     new EqualsTester()
176         .addEqualityGroup(A.field("privateField"), A.field("privateField"))
177         .addEqualityGroup(A.field("publicField"))
178         .addEqualityGroup(A.constructor(), A.constructor())
179         .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
180         .addEqualityGroup(A.method("publicFinalMethod"))
181         .testEquals();
182   }
183 
184   public void testNulls() {
185     new NullPointerTester()
186         .testAllPublicStaticMethods(Element.class);
187   }
188 
189   @Retention(RetentionPolicy.RUNTIME)
190   private @interface Tested {}
191 
192   private static abstract class A {
193     @Tested private boolean privateField;
194     @Tested int packagePrivateField;
195     @Tested protected int protectedField;
196     @Tested public String publicField;
197     @Tested private static Iterable<String> staticField;
198     @Tested private final Object finalField;
199     private volatile char volatileField;
200     private transient long transientField;
201 
202     @Tested public A(Object finalField) {
203       this.finalField = finalField;
204     }
205 
206     @Tested abstract void abstractMethod();
207 
208     @Tested void overridableMethod() {}
209 
210     @Tested protected void protectedMethod() {}
211 
212     @Tested private void privateMethod() {}
213 
214     @Tested public final void publicFinalMethod() {}
215 
216     void notAnnotatedMethod() {}
217 
218     static Element field(String name) throws Exception {
219       Element element = new Element(A.class.getDeclaredField(name));
220       assertEquals(name, element.getName());
221       assertEquals(A.class, element.getDeclaringClass());
222       return element;
223     }
224 
225     static Element constructor() throws Exception {
226       Constructor<?> constructor = A.class.getDeclaredConstructor(Object.class);
227       Element element = new Element(constructor);
228       assertEquals(constructor.getName(), element.getName());
229       assertEquals(A.class, element.getDeclaringClass());
230       return element;
231     }
232 
233     static Element method(String name, Class<?>... parameterTypes) throws Exception {
234       Element element = new Element(A.class.getDeclaredMethod(name, parameterTypes));
235       assertEquals(name, element.getName());
236       assertEquals(A.class, element.getDeclaringClass());
237       return element;
238     }
239     
240     native void nativeMethod();
241 
242     synchronized void synchronizedMethod() {}
243   }
244 }